package com.qf;

import com.qf.service.FangDongServiceImpl;
import com.qf.service.UserServiceImpl;
import com.qf.service.ZufangService;
import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 *
 * 动态代理模式
 * @author lixu
 */
public class SpringDyProxyJunit {


    /**
     * JDK自带的动态代理 模式
     */
    @Test
    public void testDyProxy(){
        final ZufangService zufangService = new FangDongServiceImpl();
        //参数1：类加载器
        //参数2：代理的接口
        Class<?>[] interfaces = {ZufangService.class};
        //参数3：代理实现类中执行的方法中辅助代码
        ZufangService proxy = (ZufangService) Proxy.newProxyInstance(
                UserServiceImpl.class.getClassLoader(),
                interfaces,
                new InvocationHandler() {// 匿名内部类
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        System.out.println("我们联系中介");
                        System.out.println("带着我们去看房");
                        //房东
                        zufangService.zufang();//核心业务

                        System.out.println("维修");
                        System.out.println("转租");

                        return null;
                    }
                }
        );
        proxy.zufang();
    }
    /**
     * 动态代理  --- Cglib  不是JDK自带  导入Jar或 引入坐标
     *
     *  不需要接口 只能实现类也是可以实现动态代理的
     *
     *  ZufangService  zufangService = new FangDongServiceImpl();
     *
     *  FangDongServiceImpl: 父类
     *                       子类  重写父类中的方法  将方法进行增强
     *
     */
    @Test
    public void testCglibDyProxy(){
        final ZufangService zufangService = new FangDongServiceImpl();
        //增强对象  Cglib实现对象
        Enhancer enhancer = new Enhancer();
        //设置超类  父类
        enhancer.setSuperclass(FangDongServiceImpl.class);
        enhancer.setCallback(new org.springframework.cglib.proxy.InvocationHandler() {// 匿名内部类
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                System.out.println("我们联系中介");
                System.out.println("带着我们去看房");
                //房东
                zufangService.zufang();//核心业务

                System.out.println("维修");
                System.out.println("转租");

                return null;
            }
        });
        //创建代理类了
        ZufangService zufangService1 = (ZufangService) enhancer.create();

        zufangService1.zufang();
    }
}
